/**
 * 
 * 扩展开发参考文章：
 * https://www.cnblogs.com/liuxianan/p/chrome-plugin-develop.html#blog-comments-placeholder
 * https://blog.csdn.net/guoqiankunmiss/article/details/135847091 
 * https://www.ygbks.com/4218.html
 * 
 * 
 * //js 读写 sqllite数据库说明：https://github.com/sql-js/sql.js
 * 引入本地的sql.js,asm版本只需要一个文件，wasmbuild版本需要两个文件,
 * 由于浏览器扩展的沙盒机制，无法直接访问本地文件，所以需要通过 chrome.runtime.getURL() 方法获取扩展的根目录，
 * 同时由于沙箱的机制，也无法修改本地文件系统，所以使用sqllite来存储数据的方案不是很实际（保存数据需要通过下载来实现，而不是直接修改扩展中的db文件
 * 数据库的修改都是在内存中的
 * ）
 */
  // 检查当前页面是否为 userset/my_apply.php
let ex_path_name = window.location.pathname;

  //已申请记录列表
let __arr_apply_list = null;

  //已查看记录列表
let __arr_view_list = null;

  //已收藏记录列表
let __arr_fav_list =  null;

  // 岗位搜索岗位列表对象
let __arrJobList =  null;

//申请记录页面Url
let __str_apply_url = null;

//已查看记录页面Url
let __str_view_url = null;

//收藏记录页面Url
let __str_fav_url = null;

//职位搜索页面Url
let __str_jobs_url = null;

//存储当前网站的cookie
let __cookies = null;

//是否展开面板框，默认关闭
let __expand_box = 0;


let __sites = {
    "51job":{
        "name":"前程无忧",
        "domain":"51job.com"
    },
    "liepin":{
        "name":"猎聘",
        "domain":"liepin.com"
    },
    "zhaopin":{
      "name":"智联",
      "domain":"zhaopin.com"
  },
};

let  __site_code = null;

get_site_code = function (){
  var domain = window.location.hostname;

  for(var key in __sites){
      if(domain.indexOf(__sites[key].domain) >=0 ){
        console.log(key);
        return key;
      }
  }
  return null;
},


//获取当前页面的站点
__site_code = get_site_code()


// 向页面注入JS
function injectCustomJs(jsPath)
{
	jsPath = jsPath || 'js/inject.js';
	var temp = document.createElement('script');
	temp.setAttribute('type', 'text/javascript');
  
	// 获得的地址类似：chrome-extension://ihcokhadfjfchaeagdoclpnjdiokfakg/js/inject.js
	temp.src = chrome.runtime.getURL(jsPath);
	temp.onload = function()
	{
		// 放在页面不好看，执行完后移除掉
		this.parentNode.removeChild(this);
	};
	document.body.appendChild(temp);
}

injectCustomJs("libs/js/xhr_script.js");

function page_type(){

    if(document.location.href.indexOf(__str_jobs_url)>=0){
      return "jobs";
    }

    if(document.location.href.indexOf(__str_apply_url)>=0){
      return "apply";
    }

    if(document.location.href.indexOf(__str_view_url)>=0){
      return "view";
    }

    if(document.location.href.indexOf(__str_fav_url)>=0){
      return "fav";
    }

  return "";
}

// 向页面注入Css
function injectCss(){
  var css_type = page_type();

  var style = document.getElementById('job_helper_css');

  // 如果找到了，就从DOM中移除
  if (style) {
      style.parentNode.removeChild(style);
  }

  if(css_type){
    $('head').append('<style id="job_helper_css">'+ __css[css_type] +'</style>');
  }
  //$('head').append('<link rel="stylesheet" type="text/css" href="'+ chrome.runtime.getURL(cssPath) +'">');
}

//创建浮动区域
function  createMainBox(){

  let icon_url =  chrome.runtime.getURL("styles/icons/icon.png");

      // 创建固定区域
      const fixedDiv = document.createElement('div');
      fixedDiv.id = 'job_helper_box'
      fixedDiv.className="card";
      // 添加元素内容
      fixedDiv.innerHTML = `
        <div id="job_helper_box_title" title="拖动可以移动位置哦">
          <img class="job_helper_box_icon" src="`+icon_url+`" title="点击展开/收起面板"/>
        </div>
        <div id="job_helper_main">  
          <ul>
            <li id="job_helper_list_jobs"><a class="monitor_list_title">职位列表:</a><span class="monitor_num"></span></li>
            <li id="job_helper_list_apply">
              <a class="monitor_list_title" title="点击查看投递记录">投递记录:</a>
              <span class="monitor_num">0</span> <button class="btn btn-primary btn-sm fresh_monitor_num">刷新</button>
            </li>
            <li id="job_helper_list_view">
              <a class="monitor_list_title" title="点击查看谁查看我">谁查看我:</a>
              <span class="monitor_num">0</span> <button class="btn btn-primary btn-sm fresh_monitor_num">刷新</button>
            </li>
            <li id="job_helper_list_fav">
              <a class="monitor_list_title" title="点击查看我的收藏">我的收藏:</a>
              <span class="monitor_num">0</span> <button class="btn btn-primary btn-sm fresh_monitor_num">刷新</button>
            </li>
          </ul>

          <div id="job_helper_action"></div>
          <div id="job_helper_box_info"></div>
        </div>

      `;

      // 将固定区域插入到页面中
      document.body.appendChild(fixedDiv);
}

 function showInfo(msg,type){
  jQuery("#job_helper_box_info").addClass("job_helper_box_"+type)
  jQuery("#job_helper_box_info").html(msg);
}

 function getStringBetweenTags(htmlContent, startTag, endTag) {

      // 查找开始和结束标记的位置
      const startIndex = htmlContent.indexOf(startTag) + startTag.length;
      const endIndex = htmlContent.indexOf(endTag,startIndex);
  
      if (startIndex !== -1 && endIndex !== -1) {
        // 提取中间的字符
        return contentBetweenTags = htmlContent.substring(startIndex, endIndex).trim();
      
      } else {
        return null;
      }
 }


 function dateDiff(unit, startDate, endDate) {
  // 将输入的字符串或Date对象转换为Date对象
  startDate = new Date(startDate);
  endDate = new Date(endDate);

  // 确保我们处理的是有效的日期
  if (isNaN(startDate.getTime()) || isNaN(endDate.getTime())) {
      throw new Error('Invalid date');
  }

  // 定义每个单位的毫秒数
  const units = {
      y: 1000 * 60 * 60 * 24 * 365.25,
      q: 1000 * 60 * 60 * 24 * 365.25 / 4,
      mon: 1000 * 60 * 60 * 24 * 365.25 / 12,
      d: 1000 * 60 * 60 * 24,
      w: 1000 * 60 * 60 * 24 * 7,
      h: 1000 * 60 * 60,
      min: 1000 * 60,
      s: 1000,
      mil: 1
  };

  // 计算两个日期之间的毫秒差
  let diffMs = Math.abs(endDate - startDate);

  // 根据提供的单位返回差异
  if (units.hasOwnProperty(unit)) {
      return Math.floor(diffMs / units[unit]);
  } else {
      throw new Error('Unsupported unit: ' + unit);
  }
}


/**
 * 格式化日期
 * @param {Date} date - 要格式化的日期对象
 * @param {string} fmt - 格式化字符串，例如 "yyyy-MM-dd HH:mm:ss"
 * @returns {string} 格式化后的日期字符串
 */
function DataFormat(date, fmt) {

  if (!(date instanceof Date)) {
    console.error("DataFormat: 第一个参数必须是 Date 对象");
    return "";
  }

  if (typeof fmt !== "string" || fmt.length === 0) {
    console.error("DataFormat: 第二个参数必须是有效的格式化字符串");
    return "";
  }


  const o = {
    "M+": date.getMonth() + 1, // 月份
    "d+": date.getDate(), // 日
    "H+": date.getHours(), // 小时
    "m+": date.getMinutes(), // 分
    "s+": date.getSeconds(), // 秒
    "q+": Math.floor((date.getMonth() + 3) / 3), // 季度
    "S": date.getMilliseconds() // 毫秒
  };

  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
  }

  for (const k in o) {
    if (new RegExp("(" + k + ")").test(fmt)) {
      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    }
  }

  return fmt;
}
// 发送消息到后台脚本
chrome.runtime.sendMessage({ action: "getCookies" }, function(response) {
  if (response && response.cookies) {
    console.log("Received cookies:", response.cookies);
  } else {
    console.log("No cookies received.");
  }
});


  //初始化显示容器和样式
  function init_job_helper_box(){
      createMainBox();
      injectCss();
  }

//展开/收起面板
  function toggle_job_helper_box(set_new_status = true){

      console.log("toggle_job_helper_box");

      // 异步获取是否展开设置
      chrome.storage.local.get(['__expand_box'], function(result) {

        if(result['__expand_box']){
          __expand_box  = result['__expand_box']? 1:0
        }else{
          __expand_box = 0;
        }


        if(set_new_status){
          __expand_box = !__expand_box;
        }

        if (__expand_box) {
          jQuery("#job_helper_main").show();
          jQuery("#job_helper_box_title").addClass("job_helper_box_title").addClass("card-header");
          jQuery("#job_helper_box").css({'width': '200px','border-width': '1px'});


        }else{
          jQuery("#job_helper_main").hide();
          jQuery("#job_helper_box_title").removeClass("job_helper_box_title").removeClass("card-header");
          jQuery("#job_helper_box").css({'width': '50px','border-width': '0px'});


style="border:0px"


        }

        chrome.storage.local.set({'__expand_box': __expand_box}, function() {
        });

      });
  }
  


  jQuery(document).ready(function(){

    //初始化显示容器
    init_job_helper_box();

    // 使job_helper_box 元素可拖动
    $("#job_helper_box").draggable({
      handle: "#job_helper_box_title", // 指定拖动手柄为 job_helper_box_title
      cursor: "move" // 设置鼠标按下时的样式为移动光标
    });


    // 异步获取是否展开设置,默认不需要刷新数值
    toggle_job_helper_box(false);

    //加载本地存储中的数据
    load_local_data();

    //#同步申请记录
    jQuery("#job_helper_list_apply .fresh_monitor_num").click(refresh_apply_info);

    //#同步查看记录
    jQuery("#job_helper_list_view .fresh_monitor_num").click(refresh_view_info);

    //#同步收藏记录
    jQuery("#job_helper_list_fav .fresh_monitor_num").click(refresh_fav_info);

    //#展开缩小面板
    jQuery(".job_helper_box_icon").click(toggle_job_helper_box);
    

    //初始化链接
    jQuery("#job_helper_list_apply  a.monitor_list_title").attr("href", __str_apply_url);
    jQuery("#job_helper_list_view  a.monitor_list_title").attr("href", __str_view_url);
    jQuery("#job_helper_list_fav  a.monitor_list_title").attr("href", __str_fav_url);
    jQuery("#job_helper_list_jobs  a.monitor_list_title").attr("href", __str_jobs_url);

  });

  // 在内容脚本中
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {

  console.log('request.from:', request.from);

  if (request.from === "cc") {
    // 处理接收到的数据
    console.log('Received data:', request);
    sendResponse({number: request.number + 1});
  }
});


window.addEventListener("message", function(e){

  let url = e.data.url;
  let response = e.data.response;

  if(url){

    console.log('监听数据', url);

    //数据返回后处理，各目标网站Js 各自实现逻辑
    ajax_hook(e);

    /*
      //判断指定ajax请求
      if(url.indexOf('https://we.51job.com/api/job/search-pc?api_key=51job') >= 0 ){

        //console.log('监听数据', response);

        var jsonRst = {}
        var result  = JSON.parse(response);
            result  = result.resultbody.job.items;

          for(var i=0; i< result.length; i++){
              jsonRst[result[i].jobid] = result[i];
          }

          __arrJobList = jsonRst;

      }

      */
  }
})


function timestamp_to_date(timestamp){

  // 将时间戳转换为日期对象
  const date = new Date(timestamp);

  // 获取年份、月份、日期、小时、分钟和秒数
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始，需要加1，并补齐两位数
  const day= String(date.getDate()).padStart(2, '0');

  return `${year}-${month}-${day}`;
}

function parse_date_from_str(time_str){

  // 提取年、月、日
  const year = time_str.slice(0, 4);
  const month = time_str.slice(4, 6);
  const day = time_str.slice(6, 8);

  // 格式化为 yyyy-mm-dd
  const formattedDate = `${year}-${month}-${day}`;

  return formattedDate;
}




/* sqllite作为数据库存储 

const dbFileUrl = chrome.runtime.getURL('data/mydb.sqlite');

function downloadDatabase() {
  // 导出数据库为二进制数据
  const data = db.export();

  // 创建一个 Blob 对象来保存数据库文件
  const blob = new Blob([data], { type: 'application/octet-stream' });

  // 创建下载链接
  const url = window.URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = 'mydatabase.sqlite'; // 设置下载文件名
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);

  // 释放对象 URL
  window.URL.revokeObjectURL(url);
}

// 在需要下载数据库时调用此函数
//downloadDatabase();

//<button onclick="downloadDatabase()">Download SQLite Database</button>

async function initDatabase() {

  const dbFileUrl = chrome.runtime.getURL('data/mydb.sqlite');

  //const SQL = await initSqlJs({ locateFile: file => dbFileUrl });
  //db = new SQL.Database();
  var db;
  var config = {
    //locateFile: filename => `data/mydb.sqlite`
    locateFile: filename => dbFileUrl
  }


	initSqlJs(config).then(function (SQL) {
    __db = new SQL.Database();
    // 创建表
    //__db.run("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)");

    // 插入一些数据
    __db.run("INSERT INTO apply_info (job_id) VALUES (?)", ["Alice"]);
    __db.run("INSERT INTO apply_info (job_id) VALUES (?)", ["Bob"]);

    const result = __db.exec("SELECT * FROM apply_info");
    console.log(result);

  });

}

initDatabase();
async function queryDatabase() {
  const result = __db.exec("SELECT * FROM users");
  console.log(result);
  return result;
}

queryDatabase().then(data => {
  sendResponse({ data });
});

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
  if (message.action === 'query') {
    queryDatabase().then(data => {
      sendResponse({ data });
    });
    return true;  // Return true to indicate that the response will be sent asynchronously.
  }
});

*/